package com.example.lottery.dao.handler;

import com.example.lottery.common.utils.DecryptUtils;
import com.example.lottery.common.utils.EncryptUtils;
import com.example.lottery.common.utils.JacksonUtil;
import com.example.lottery.dao.dataobject.Encrypt;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.springframework.util.StringUtils;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@Slf4j
@MappedTypes(Encrypt.class)//java类
@MappedJdbcTypes(JdbcType.VARCHAR)//数据库类型
public class EncryptTypeHandler extends BaseTypeHandler<Encrypt> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Encrypt parameter, JdbcType jdbcType) throws SQLException {
        //参数判断，如果parameter为空，就直接设置为空值，否则后期会有null异常
        if(parameter==null||!StringUtils.hasLength(parameter.getValue())){
            ps.setString(i,null);
            return;
        }
        log.info("设置值：手机号加密前的内容：{}",JacksonUtil.writeValueAsString(parameter.getValue()));
        //加密操作 AES对称加密
        String secret = EncryptUtils.EncryptAES(parameter.getValue());
        //预编译sql设置值 由于数据库是varchar类型，并且插入的数据是String
        ps.setString(i,secret);
    }

    @Override
    public Encrypt getNullableResult(ResultSet rs, String columnName) throws SQLException {
        log.info("取出值：手机号解密前的内容：{}",JacksonUtil.writeValueAsString(rs.getString(columnName)));
        //从结果集中获取存储在数据库的值
        String str = rs.getString(columnName);
        //解密操作
        String s = DecryptUtils.decryptAES(str);
        //返回
        return new Encrypt(s);
    }

    @Override
    public Encrypt getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        log.info("取出值：手机号加密前的内容：{}",JacksonUtil.writeValueAsString(rs.getString(columnIndex)));
        //从结果集中获取存储在数据库的值
        String str = rs.getString(columnIndex);
        //解密操作
        String s = DecryptUtils.decryptAES(str);
        //返回
        return new Encrypt(s);
    }

    @Override
    public Encrypt getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        log.info("取出值：手机号加密前的内容：{}",JacksonUtil.writeValueAsString(cs.getString(columnIndex)));
        //从结果集中获取存储在数据库的值
        String str = cs.getString(columnIndex);
        //解密操作
        String s = DecryptUtils.decryptAES(str);
        //返回
        return new Encrypt(s);
    }
}
